/**
 * jqGrid complexGroupHeaders
 * name cj
 * email 85309651@qq.com
 * blog http://cjblog.iteye.com/
 * version 0.2
 * date 2012-06-03
 **/
(function ($) {
    $.jgrid.extend({
        /**
         * 三级表头 by ljq
         * @参数 o : 三级表头参数
         */
        setComplexHeaders: function (o) {
            o = $.extend({
                complexHeaders: {
                    defaultStyle: true,
                    threeLevel: [],
                    twoLevel: []
                }
            }, o || {});
            return this.each(function () {
                //三级表头和二级表头
                var complexHeaders = o.complexHeaders,
                    threeHeaders = complexHeaders["threeLevel"],
                    twoHeaders = complexHeaders["twoLevel"];
                if (threeHeaders.length === 0 || twoHeaders.length === 0) {
                    return;
                }
                this.p.complexHeader = o;
                var ts = this,
                    defaultStyle = complexHeaders.defaultStyle === undefined ? true : complexHeaders.defaultStyle,
                    i, cmi, $thirdHeaderRow, $fourHeaderRow, $colHeader, th, $th, thStyle,
                    iCol,
                    tempInCol,
                    inThreeCol,
                    inTwoCol,
                    threeLevelSkip = 0,
                    twoLevelSkip = 0,
                    hasTwoLevel = false,
                    cghi,
                    numberOfColumns,
                    titleText,
                    cVisibleColumns,
                    colModel = ts.p.colModel,
                    cml = colModel.length,
                    ths = ts.grid.headers,
                    $htable = $("table.ui-jqgrid-htable", ts.grid.hDiv),
                    $secondHeaderRow = $htable.children("thead").children("tr.ui-jqgrid-labels:last").addClass("jqg-second-row-header"),
                    $thead = $htable.children("thead"),
                    $theadInTable,
                    originalResizeStop,
                    $firstHeaderRow = $htable.find(".jqg-first-row-header");
                if ($firstHeaderRow[0] === undefined) {
                    $firstHeaderRow = $('<tr>', {
                        role: "row",
                        "aria-hidden": "true"
                    }).addClass("jqg-first-row-header").css("height", "auto");
                } else {
                    $firstHeaderRow.empty();
                }
                var $firstRow,
                    inColumnHeader = function (text, columnHeaders) {
                        var i = 0, length = columnHeaders.length;
                        for (; i < length; i++) {
                            if (columnHeaders[i] && columnHeaders[i].startColumnName === text) {
                                return i;
                            }
                        }
                        return -1;
                    };

                $(ts).prepend($thead);
                $thirdHeaderRow = $('<tr>', {role: "rowheader"}).addClass("ui-jqgrid-labels jqg-third-row-header");
                $fourHeaderRow = $('<tr>', {role: "rowheader"}).addClass("ui-jqgrid-labels jqg-four-row-header");

                //循环模型每列
                for (i = 0; i < cml; i++) {
                    th = ths[i].el;
                    $th = $(th);
                    cmi = colModel[i];
                    // 给第一行添加单元格
                    thStyle = {height: '0px', width: ths[i].width + 'px', display: (cmi.hidden ? 'none' : '')};
                    $("<th>", {role: 'gridcell'}).css(thStyle).addClass("ui-first-th-" + ts.p.direction).appendTo($firstHeaderRow);
                    //移除不需要的样式
                    th.style.width = "";

                    //是否在threeHeaders配置里面
                    inThreeCol = inColumnHeader(cmi.name, threeHeaders);
                    if (inThreeCol >= 0) {
                        cghi = threeHeaders[inThreeCol];
                        numberOfColumns = parseInt(cghi.numberOfColumns, 10);
                        titleText = cghi.titleText;

                        // 计算显示的列长度
                        for (cVisibleColumns = 0, iCol = 0; iCol < numberOfColumns && (i + iCol < cml); iCol++) {
                            if (!colModel[i + iCol].hidden) {
                                cVisibleColumns++;
                            }
                        }

                        $colHeader = $('<th>').attr({role: "columnheader", noWrap: true})
                            .addClass("ui-state-default ui-th-column-header ui-th-" + ts.p.direction)
                            .css({'height': '22px', 'border-top': '0px none', 'overflow': 'hidden'})
                            .html(titleText);
                        if (cVisibleColumns > 0) {
                            $colHeader.attr("colspan", String(cVisibleColumns));
                        }
                        if (ts.p.headertitles) {
                            $colHeader.attr("title", $colHeader.text());
                        }
                        //如果没有可见列则隐藏
                        if (cVisibleColumns === 0) {
                            $colHeader.hide();
                        }
                        $th.before($colHeader);
                        threeLevelSkip = numberOfColumns;
                        if (defaultStyle === false) {
                            hasTwoLevel = false;
                            //判断是否存在二层
                            for (var a = 0; a < threeLevelSkip && (a + i < cml); a++) {
                                tempInCol = inColumnHeader(colModel[a + i].name, twoHeaders);
                                if (tempInCol >= 0) {
                                    cghi = twoHeaders[tempInCol];
                                    numberOfColumns = parseInt(cghi.numberOfColumns, 10);
                                    // 计算显示的列长度
                                    for (iCol = 0; iCol < numberOfColumns && (a + i + iCol < cml); iCol++) {
                                        if (!colModel[a + i + iCol].hidden) {
                                            hasTwoLevel = true;
                                            break;
                                        }
                                    }
                                    if (hasTwoLevel === true) {
                                        break;
                                    }
                                }
                            }
                        }
                    }

                    //是否在twoHeaders配置里面
                    inTwoCol = inColumnHeader(cmi.name, twoHeaders);
                    if (threeLevelSkip > 0 && inTwoCol >= 0) {
                        cghi = twoHeaders[inTwoCol];
                        numberOfColumns = parseInt(cghi.numberOfColumns, 10);
                        titleText = cghi.titleText;

                        // 计算显示的列长度
                        for (cVisibleColumns = 0, iCol = 0; iCol < numberOfColumns && (i + iCol < cml); iCol++) {
                            if (!colModel[i + iCol].hidden) {
                                cVisibleColumns++;
                            }
                        }

                        $colHeader = $('<th>').attr({role: "columnheader", noWrap: true})
                            .addClass("ui-state-default ui-th-column-header ui-th-" + ts.p.direction)
                            .css({'height': '22px', 'border-top': '0px none', 'overflow': 'hidden'})
                            .html(titleText);
                        if (cVisibleColumns > 0) {
                            $colHeader.attr("colspan", String(cVisibleColumns));
                        }

                        if (ts.p.headertitles) {
                            $colHeader.attr("title", $colHeader.text());
                        }
                        //如果没有可见列则隐藏
                        if (cVisibleColumns === 0) {
                            $colHeader.hide();
                        }
                        $thirdHeaderRow.append($colHeader);
                        twoLevelSkip = numberOfColumns;
                    }

                    //不在第三层
                    if (threeLevelSkip === 0) {
                        $th.attr("rowspan", "3");
                        twoLevelSkip = 0;
                        continue;
                    }

                    //在第三层不在第二层
                    if (threeLevelSkip > 0 && twoLevelSkip === 0) {
                        if (defaultStyle) {
                            $th.attr("rowspan", "2");
                            $thirdHeaderRow.append(th);
                        } else {
                            if (hasTwoLevel) {
                                $th.attr("rowspan", "2");
                                $thirdHeaderRow.append(th);
                            } else {
                                $colHeader.attr("rowspan", "2");
                                $fourHeaderRow.append(th);
                            }
                        }
                        threeLevelSkip--;
                        continue;
                    }

                    //在第三层也在第二层
                    if (threeLevelSkip > 0 && twoLevelSkip > 0) {
                        $fourHeaderRow.append(th);
                        threeLevelSkip--;
                        twoLevelSkip--;
                    }
                }
                $theadInTable = $(ts).children("thead");
                $theadInTable.prepend($firstHeaderRow);
                $thirdHeaderRow.insertAfter($secondHeaderRow);
                $fourHeaderRow.insertAfter($thirdHeaderRow);
                $htable.append($theadInTable);

                $htable.find("span.ui-jqgrid-resize").each(function () {
                    var $parent = $(this).parent();
                    if ($parent.is(":visible")) {
                        this.style.cssText = 'height: ' + ($parent.height()/*+4*/) + 'px !important; cursor: col-resize;';
                    }
                });
                $htable.find("div.ui-jqgrid-sortable").each(function () {
                    var $ts = $(this), $parent = $ts.parent();
                    if ($parent.is(":visible") && $parent.is(":has(span.ui-jqgrid-resize)")) {
                        $ts.css('top', ($parent.height() - $ts.outerHeight()) / 2 + 'px');
                    }
                });

                $firstRow = $theadInTable.find("tr.jqg-first-row-header");
                $(ts).bind('jqGridResizeStop.setGroupHeaders', function (e, nw, idx) {
                    $firstRow.find('th').eq(idx).width(nw);
                });
            });
        },

        /**
         * 构造多表头冻结表格 by ljq
         * @参数 maxfrozen : 冻结的列index
         * @参数 htbl : 表格
         */
        createFrozenHtable: function (maxfrozen, htbl) {
            var ts = this[0],
                complexHeader = ts.p.complexHeader,
                complexHeaders = complexHeader["complexHeaders"],
                defaultStyle = complexHeaders.defaultStyle,
                threeHeaders = complexHeaders["threeLevel"],
                twoHeaders = complexHeaders["twoLevel"],
                tableid = ts.p.id,
                colModel = ts.p.colModel,
                cml = maxfrozen + 1,
                ths = ts.grid.headers,
                threeLevelSkip = 0,
                twoLevelSkip = 0,
                hasTwoLevel = false,
                i, cmi, thStyle, th, $th, cn, $tempTh, iCol, $colHeader, cghi,
                tempInCol,
                inThreeCol,
                inTwoCol,
                numberOfColumns,
                titleText,
                cVisibleColumns,
                height = ts.grid.fhDiv.height(),
                $fhTable = $("<table class='ui-jqgrid-htable' style='width:1px;height:" + height + "px' role='grid' aria-labelledby='gbox_" + tableid + "' cellspacing='0' cellpadding='0' border='0'></table>"),
                $thead = $("<thead></thead>"),
                $firstHeaderRow = $('<tr>', {
                    role: "row",
                    "aria-hidden": "true"
                }).addClass("jqg-first-row-header").css("height", "auto"),
                $secondHeaderRow = $('<tr>', {role: "rowheader"}).addClass("ui-jqgrid-labels jqg-second-row-header"),
                $thirdHeaderRow = $('<tr>', {role: "rowheader"}).addClass("ui-jqgrid-labels jqg-third-row-header"),
                $fourHeaderRow = $('<tr>', {role: "rowheader"}).addClass("ui-jqgrid-labels jqg-four-row-header"),
                inColumnHeader = function (text, columnHeaders) {
                    var i = 0, length = columnHeaders.length;
                    for (; i < length; i++) {
                        if (columnHeaders[i] && columnHeaders[i].startColumnName === text) {
                            return i;
                        }
                    }
                    return -1;
                };

            //循环模型每列
            for (i = 0; i < cml; i++) {
                cmi = colModel[i];
                cn = cmi.name;
                $th = $("#" + tableid + "_" + cn, htbl);
                // 给第一行添加单元格
                thStyle = {height: '0px', width: ths[i].width + 'px', display: (cmi.hidden ? 'none' : '')};
                $("<th>", {role: 'gridcell'}).css(thStyle).addClass("ui-first-th-" + ts.p.direction).appendTo($firstHeaderRow);
                //是否在threeHeaders配置里面
                inThreeCol = inColumnHeader(cmi.name, threeHeaders);
                if (inThreeCol >= 0) {
                    cghi = threeHeaders[inThreeCol];
                    numberOfColumns = parseInt(cghi.numberOfColumns, 10);
                    if (numberOfColumns + i - 1 > maxfrozen) {
                        numberOfColumns = maxfrozen - i + 1;
                    }
                    titleText = cghi.titleText;
                    // 计算显示的列长度
                    for (cVisibleColumns = 0, iCol = 0; iCol < numberOfColumns && (i + iCol < cml); iCol++) {
                        if (!colModel[i + iCol].hidden) {
                            cVisibleColumns++;
                        }
                    }
                    $colHeader = $('<th>').attr({role: "columnheader", noWrap: true})
                        .addClass("ui-state-default ui-th-column-header ui-th-" + ts.p.direction)
                        .css({'height': '22px', 'border-top': '0px none', 'overflow': 'hidden'})
                        .html(titleText);
                    if (cVisibleColumns > 0) {
                        $colHeader.attr("colspan", String(cVisibleColumns));
                    }
                    if (ts.p.headertitles) {
                        $colHeader.attr("title", $colHeader.text());
                    }
                    //如果没有可见列则隐藏
                    if (cVisibleColumns === 0) {
                        $colHeader.hide();
                    }
                    $colHeader.appendTo($secondHeaderRow);
                    threeLevelSkip = numberOfColumns;
                    if (defaultStyle === false) {
                        hasTwoLevel = false;
                        //判断是否存在二层
                        for (var a = 0; a < threeLevelSkip && (a + i < cml); a++) {
                            tempInCol = inColumnHeader(colModel[a + i].name, twoHeaders);
                            if (tempInCol >= 0) {
                                cghi = twoHeaders[tempInCol];
                                numberOfColumns = parseInt(cghi.numberOfColumns, 10);
                                if (numberOfColumns + a + i - 1 > maxfrozen) {
                                    numberOfColumns = maxfrozen - (a + i) + 1;
                                }
                                // 计算显示的列长度
                                for (iCol = 0; iCol < numberOfColumns && (a + i + iCol < cml); iCol++) {
                                    if (!colModel[a + i + iCol].hidden) {
                                        hasTwoLevel = true;
                                        break;
                                    }
                                }
                            }
                            if (hasTwoLevel === true) {
                                break;
                            }
                        }
                    }
                }
                //是否在twoHeaders配置里面
                inTwoCol = inColumnHeader(cmi.name, twoHeaders);
                if (threeLevelSkip > 0 && inTwoCol >= 0) {
                    cghi = twoHeaders[inTwoCol];
                    numberOfColumns = parseInt(cghi.numberOfColumns, 10);
                    if (numberOfColumns + i - 1 > maxfrozen) {
                        numberOfColumns = maxfrozen - i + 1;
                    }
                    titleText = cghi.titleText;
                    // 计算显示的列长度
                    for (cVisibleColumns = 0, iCol = 0; iCol < numberOfColumns && (i + iCol < cml); iCol++) {
                        if (!colModel[i + iCol].hidden) {
                            cVisibleColumns++;
                        }
                    }
                    $colHeader = $('<th>').attr({role: "columnheader", noWrap: true})
                        .addClass("ui-state-default ui-th-column-header ui-th-" + ts.p.direction)
                        .css({'height': '22px', 'border-top': '0px none', 'overflow': 'hidden'})
                        .html(titleText);
                    if (cVisibleColumns > 0) {
                        $colHeader.attr("colspan", String(cVisibleColumns));
                    }
                    if (ts.p.headertitles) {
                        $colHeader.attr("title", $colHeader.text());
                    }
                    //如果没有可见列则隐藏
                    if (cVisibleColumns === 0) {
                        $colHeader.hide();
                    }
                    $colHeader.appendTo($thirdHeaderRow);
                    twoLevelSkip = numberOfColumns;
                }
                //不在第三层
                if (threeLevelSkip === 0) {
                    $th.attr("rowspan", "3");
                    $th.appendTo($secondHeaderRow);
                    twoLevelSkip = 0;
                    continue;
                }
                //在第三层不在第二层
                if (threeLevelSkip > 0 && twoLevelSkip === 0) {
                    if (defaultStyle) {
                        $th.attr("rowspan", "2");
                        $th.appendTo($thirdHeaderRow);
                    } else {
                        if (hasTwoLevel) {
                            $th.attr("rowspan", "2");
                            $th.appendTo($thirdHeaderRow);
                        } else {
                            $colHeader.attr("rowspan", "2");
                            $th.appendTo($fourHeaderRow);
                        }
                    }
                    threeLevelSkip--;
                    continue;
                }
                //在第三层也在第二层
                if (threeLevelSkip > 0 && twoLevelSkip > 0) {
                    $th.appendTo($fourHeaderRow);
                    threeLevelSkip--;
                    twoLevelSkip--;
                }
            }
            var thirdLen = $thirdHeaderRow.children().length,
                fourLen = $fourHeaderRow.children().length;
            if (thirdLen === 0 && fourLen === 0) {
                $secondHeaderRow.height(height);
            }
            if (defaultStyle) {
                //默认渲染样式处理
                if (thirdLen > 0 && fourLen === 0) {
                    $thirdHeaderRow.height(height - 23);
                }
            } else {
                if (thirdLen === 0 && fourLen > 0) {
                    $secondHeaderRow.height(height - 23);
                    $secondHeaderRow.find("th").each(function () {
                        var rowspan = $(this).attr("rowspan");
                        if (rowspan) {
                            $(this).attr("rowspan", String(parseInt(rowspan, 10) - 1));
                        }
                    });
                }
            }

            $firstHeaderRow.appendTo($thead);
            $secondHeaderRow.appendTo($thead);
            thirdLen && $thirdHeaderRow.appendTo($thead);
            fourLen && $fourHeaderRow.appendTo($thead);
            $thead.appendTo($fhTable);
            return $fhTable;
        }
    });
})(jQuery);